# -*- coding: utf-8 -*-

# region 导入依赖包
import argparse
import os
import shutil

try:
    from DebugInfo.DebugInfo import *
except ImportError as impErr:
    print("尝试导入 DebugInfo 依赖时检测到异常：", impErr)
    try:
        os.system("pip install DebugInfo")
    except OSError as osErr:
        print("尝试安装模块 DebugInfo 时检测到异常：", osErr)
        exit(0)
    else:
        try:
            # 如果模块安装成功，则再次尝试导入依赖
            from DebugInfo.DebugInfo import *
        except Exception as expErr:
            print("再次尝试导入 DebugInfo 依赖时检测到异常：", expErr)
            exit(0)

try:
    if 在nt系统中():
        import win32api  # 需要安装 PyWin32 模块，以支持文件属性操作
        import win32con  # 需要安装 pywin32 模块，以支持window系统命令
except ImportError as impErr:
    print("尝试导入 win32api/win32con 依赖时检测到异常：", impErr)
    print("尝试安装 win32api/win32con 模块：")
    try:
        os.system("pip install PyWin32")
    except OSError as osErr:
        print("尝试安装模块 win32api/win32con 时检测到异常：", osErr)
        exit(0)
    else:
        try:
            # 如果模块安装成功，则再次尝试导入依赖
            import win32api
            import win32con
        except Exception as expErr:
            print("再次尝试导入 win32api/win32con 依赖时检测到异常：", expErr)
            exit(0)
# endregion

tgtDir_input = '.'
overwriteFlg_input = 0

路径分隔符:str = '\\' if 在nt系统中() else '/'

def argParseCatch(白板: 调试模板 = 调试模板()):
    global tgtDir_input
    global overwriteFlg_input

    白板.执行位置(argParseCatch)

    # 基于 argparse 模块解析脚本调用传入的参数
    parser = argparse.ArgumentParser(description='命令行调用参数解析')
    parser.add_argument('--tgtDir', help="传入进来的目标路径")
    parser.add_argument('--overwriteFlg_0No_1Yes', help="是否进行覆盖")

    ARGS_ = parser.parse_args()
    白板.消息('ARGS:', 蓝字(str(ARGS_)))

    白板.准备表格()
    if ARGS_.tgtDir:
        tgtDir_input = ARGS_.tgtDir.replace('"', '')
        白板.添加一调试行('tgtDir_input is: ', tgtDir_input)
    if ARGS_.overwriteFlg_0No_1Yes:
        overwriteFlg_input = ARGS_.overwriteFlg_0No_1Yes
        白板.添加一调试行('overwriteFlg_input is: ', overwriteFlg_input)
    白板.展示表格()

    return ARGS_


def baseScriptsCopy(tgtFolder_: str = '',
                    overwriteFlg_input_: int = -1,
                    白板: 调试模板 = 调试模板()
                    ):
    global tgtDir_input
    global overwriteFlg_input

    白板.执行位置(baseScriptsCopy)

    白板.缩进()
    if tgtFolder_ != '':
        tgtDir_input = tgtFolder_
        白板.添加一调试行('tgtFolder_ is: ', tgtDir_input)
    else:
        白板.添加一调试行('tgtFolder_ is: ', 'None')
    if overwriteFlg_input_ in [0, 1]:
        overwriteFlg_input = overwriteFlg_input_
        白板.添加一调试行('overwriteFlg_input_ is: ', overwriteFlg_input_)
    else:
        白板.添加一调试行('overwriteFlg_input_ is: ', 红字(str(overwriteFlg_input_) + '(invalid)'))

    if not os.path.isdir(tgtDir_input):
        白板.展示表格()
        白板.提示错误('tgtDir_input is not a valid path: ', tgtDir_input)
        return False

    if 白板.表格行数:
        白板.添加一调试行('', '-*-')

    flgOfCopyEnable_publish = True
    flgOfCopyEnable_autoCommit = True
    flgOfCopyEnable_csDocBuildWithGitVersion = True
    flgOfCopyEnable_gitIgnore = True
    flgOfCopyEnable_getGitVerTemplate_cs = True
    flgOfCopyEnable_gitVerInfoCfg_cs = True
    flgOfCopyEnable_getGitVerTemplate_h = True

    baseFile_publish = os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))) + 路径分隔符.join(['', 'gitVerInfo', 'publish.py'])
    baseFile_csDocBuilder_bat = os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))) + 路径分隔符.join(['', 'gitVerInfo', 'csDocBuildWithGitVersion.bat'])
    baseFile_csDocBuilder = os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))) + 路径分隔符.join(['', 'gitVerInfo', 'csDocBuildWithGitVersion.py'])
    baseFile_gitIgnore = os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))) + 路径分隔符.join(['', 'gitVerInfo', '.gitignore'])
    baseFile_gitVerTemplate_cs = os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))) + 路径分隔符.join(['', 'gitVerInfo', 'gitVer.cs'])
    baseFile_gitVerTemplate_h = os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))) + 路径分隔符.join(['', 'gitVerInfo', 'gitVer.h'])
    baseFile_gitVerInfoCfg = os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))) + 路径分隔符.join(['', 'gitVerInfo', 'gitVerInfoCfg.json'])

    白板.添加一调试行('baseFile_publish is: ', baseFile_publish)
    白板.添加一调试行('baseFile_csDocBuilder_bat is: ', baseFile_csDocBuilder_bat)
    白板.添加一调试行('baseFile_csDocBuilder is: ', baseFile_csDocBuilder)
    白板.添加一调试行('baseFile_gitIgnore is: ', baseFile_gitIgnore)
    白板.添加一调试行('baseFile_gitVerTemplate_cs is: ', baseFile_gitVerTemplate_cs)
    白板.添加一调试行('baseFile_gitVerTemplate_h is: ', baseFile_gitVerTemplate_h)
    白板.添加一调试行('baseFile_gitVerInfoCfg is: ', baseFile_gitVerInfoCfg)

    if 白板.表格行数:
        白板.添加一调试行('', '-*-')

    inValidFlg = False
    if flgOfCopyEnable_publish:
        if not os.path.isfile(baseFile_publish):
            白板.添加一调试行('baseFile_publish is not a valid file:',
                                  绿底白字(baseFile_publish))
            inValidFlg = True
        else:
            白板.添加一调试行('baseFile_publish checked:', 绿字('OK'))
    if flgOfCopyEnable_autoCommit:
        if not os.path.isfile(baseFile_csDocBuilder_bat):
            白板.添加一调试行('baseFile_csDocBuilder_bat is not a valid file:',
                                  红底白字(baseFile_csDocBuilder_bat))
            inValidFlg = True
        else:
            白板.添加一调试行('baseFile_csDocBuilder_bat checked:', 绿字('OK'))
    if flgOfCopyEnable_csDocBuildWithGitVersion:
        if not os.path.isfile(baseFile_csDocBuilder):
            白板.添加一调试行('baseFile_csDocBuilder is not a valid file:',
                                  红底白字(baseFile_csDocBuilder))
            inValidFlg = True
        else:
            白板.添加一调试行('baseFile_csDocBuilder checked:', 绿字('OK'))
    if flgOfCopyEnable_gitIgnore:
        if not os.path.isfile(baseFile_gitIgnore):
            白板.添加一调试行('baseFile_gitIgnore is not a valid file:',
                                  红底白字(baseFile_gitIgnore))
            inValidFlg = True
        else:
            白板.添加一调试行('baseFile_gitIgnore checked:', 绿字('OK'))
    if flgOfCopyEnable_getGitVerTemplate_cs:
        if not os.path.isfile(baseFile_gitVerTemplate_cs):
            白板.添加一调试行('baseFile_gitVerTemplate_cs is not a valid file:',
                                  红底白字(baseFile_gitVerTemplate_cs))
            inValidFlg = True
        else:
            白板.添加一调试行('baseFile_getGitVerTemplate_cs checked',
                                  绿字('OK'))
    if flgOfCopyEnable_getGitVerTemplate_h:
        if not os.path.isfile(baseFile_gitVerTemplate_h):
            白板.添加一调试行('baseFile_gitVerTemplate_h is not a valid file:',
                                  红底白字(baseFile_gitVerTemplate_h))
            inValidFlg = True
        else:
            白板.添加一调试行('baseFile_getGitVerTemplate_h checked',
                                  绿字('OK'))
    if flgOfCopyEnable_gitVerInfoCfg_cs:
        if not os.path.isfile(baseFile_gitVerInfoCfg):
            白板.添加一调试行('baseFile_gitVerInfoCfg is not a valid file:',
                                  红底白字(baseFile_gitVerInfoCfg))
            inValidFlg = True
        else:
            白板.添加一调试行('baseFile_getGitVerTemplate checked',
                                  绿字('OK'))

    if inValidFlg:
        白板.展示表格()
        return False

    if 白板.表格行数:
        白板.添加一行('', '-*-')

    eFlg = False
    fileCheckFlg = True
    if flgOfCopyEnable_publish:
        tgtFolder_baseFile_publish = tgtDir_input + 路径分隔符 + os.path.basename(baseFile_publish)
        copyFlg = False
        try:
            if not os.path.exists(tgtFolder_baseFile_publish):
                copyFlg = True
            elif os.path.exists(tgtFolder_baseFile_publish) and overwriteFlg_input and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_publish,
                                           win32api.GetFileAttributes(tgtFolder_baseFile_publish) &
                                           (~win32con.FILE_ATTRIBUTE_HIDDEN))
                os.remove(tgtFolder_baseFile_publish)
                copyFlg = True

            if copyFlg:
                shutil.copy(baseFile_publish, tgtDir_input)

            if os.path.exists(tgtFolder_baseFile_publish) and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_publish, win32con.FILE_ATTRIBUTE_HIDDEN)
        except Exception as e:
            白板.提示错误('failed to copy baseFile_publish:', e)
            eFlg = True

        if copyFlg:
            if os.path.exists(tgtFolder_baseFile_publish):
                白板.添加一行('baseFile_publish copy:', 绿字('OK'))
            else:
                白板.添加一行('file check failed: ', 红字(tgtFolder_baseFile_publish))
                fileCheckFlg = False

    if flgOfCopyEnable_autoCommit:
        tgtFolder_baseFile_csDocBuildWithGitVersion_bat = tgtDir_input + 路径分隔符 + os.path.basename(baseFile_csDocBuilder_bat)
        copyFlg = False
        try:
            if not os.path.exists(tgtFolder_baseFile_csDocBuildWithGitVersion_bat):
                copyFlg = True
            elif os.path.exists(tgtFolder_baseFile_csDocBuildWithGitVersion_bat) and overwriteFlg_input and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_csDocBuildWithGitVersion_bat,
                                           win32api.GetFileAttributes(tgtFolder_baseFile_csDocBuildWithGitVersion_bat) &
                                           (~win32con.FILE_ATTRIBUTE_HIDDEN))
                os.remove(tgtFolder_baseFile_csDocBuildWithGitVersion_bat)
                copyFlg = True

            if copyFlg:
                shutil.copy(baseFile_csDocBuilder_bat, tgtDir_input)

            if os.path.exists(tgtFolder_baseFile_csDocBuildWithGitVersion_bat) and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_csDocBuildWithGitVersion_bat, ~win32con.FILE_ATTRIBUTE_HIDDEN)
        except Exception as e:
            白板.提示错误('failed to copy baseFile_csDocBuilder_bat:', e)
            eFlg = True

        if copyFlg:
            if os.path.exists(tgtFolder_baseFile_csDocBuildWithGitVersion_bat):
                白板.添加一行('baseFile_csDocBuilder_bat copy', 绿字('OK'))
            else:
                白板.添加一行('file check failed:', 红字(tgtFolder_baseFile_csDocBuildWithGitVersion_bat))
                fileCheckFlg = False

    if flgOfCopyEnable_csDocBuildWithGitVersion:
        tgtFolder_baseFile_csDocBuilder = tgtDir_input + 路径分隔符 + os.path.basename(baseFile_csDocBuilder)
        copyFlg = False
        try:
            if not os.path.exists(tgtFolder_baseFile_csDocBuilder):
                copyFlg = True
            elif os.path.exists(tgtFolder_baseFile_csDocBuilder) and overwriteFlg_input and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_csDocBuilder,
                                           win32api.GetFileAttributes(tgtFolder_baseFile_csDocBuilder) &
                                           (~win32con.FILE_ATTRIBUTE_HIDDEN))
                os.remove(tgtFolder_baseFile_csDocBuilder)
                copyFlg = True

            if copyFlg:
                shutil.copy(baseFile_csDocBuilder, tgtDir_input)

            if os.path.exists(tgtFolder_baseFile_csDocBuilder) and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_csDocBuilder, win32con.FILE_ATTRIBUTE_HIDDEN)
        except Exception as e:
            白板.提示错误('failed to copy baseFile_csDocBuilder:', e)
            eFlg = True

        if copyFlg:
            if os.path.exists(tgtFolder_baseFile_csDocBuilder):
                白板.添加一行('baseFile_csDocBuilder copy', 绿字('OK'))
            else:
                白板.添加一行('file check failed:', 红字(tgtFolder_baseFile_csDocBuilder))
                fileCheckFlg = False

    if flgOfCopyEnable_getGitVerTemplate_cs:
        tgtFolder_baseFile_gitVerTemplate = tgtDir_input + 路径分隔符 + os.path.basename(baseFile_gitVerTemplate_cs)
        copyFlg = False
        try:
            if not os.path.exists(tgtFolder_baseFile_gitVerTemplate):
                copyFlg = True
            elif os.path.exists(tgtFolder_baseFile_gitVerTemplate) and overwriteFlg_input and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_gitVerTemplate,
                                           win32api.GetFileAttributes(tgtFolder_baseFile_gitVerTemplate) &
                                           (~win32con.FILE_ATTRIBUTE_HIDDEN))
                os.remove(tgtFolder_baseFile_gitVerTemplate)
                copyFlg = True

            if copyFlg:
                shutil.copy(baseFile_gitVerTemplate_cs, tgtDir_input)

        except Exception as e:
            白板.提示错误('failed to copy tgtFolder_baseFile_gitVerTemplate:', e)
            eFlg = True

        if copyFlg:
            if os.path.exists(tgtFolder_baseFile_gitVerTemplate):
                白板.添加一行('baseFile_gitVerTemplate_cs copy', 绿字('OK'))
            else:
                白板.添加一行('file check failed:', 红字(tgtFolder_baseFile_gitVerTemplate))
                fileCheckFlg = False
    if flgOfCopyEnable_getGitVerTemplate_h:
        tgtFolder_baseFile_gitVerTemplate = tgtDir_input + 路径分隔符 + os.path.basename(baseFile_gitVerTemplate_h)
        copyFlg = False
        try:
            if not os.path.exists(tgtFolder_baseFile_gitVerTemplate):
                copyFlg = True
            elif os.path.exists(tgtFolder_baseFile_gitVerTemplate) and overwriteFlg_input and 在nt系统中():
                win32api.SetFileAttributes(tgtFolder_baseFile_gitVerTemplate,
                                           win32api.GetFileAttributes(tgtFolder_baseFile_gitVerTemplate) &
                                           (~win32con.FILE_ATTRIBUTE_HIDDEN))
                os.remove(tgtFolder_baseFile_gitVerTemplate)
                copyFlg = True

            if copyFlg:
                shutil.copy(baseFile_gitVerTemplate_h, tgtDir_input)

        except Exception as e:
            白板.提示错误('failed to copy baseFile_gitVerTemplate_h:', e)
            eFlg = True

        if copyFlg:
            if os.path.exists(tgtFolder_baseFile_gitVerTemplate):
                白板.添加一行('baseFile_gitVerTemplate_h copy', 绿字('OK'))
            else:
                白板.添加一行('file check failed:', 红字(tgtFolder_baseFile_gitVerTemplate))
                fileCheckFlg = False
    if flgOfCopyEnable_gitIgnore:
        tgtFolder_baseFile_gitIgnore = tgtDir_input + 路径分隔符 + os.path.basename(baseFile_gitIgnore)
        copyFlg = False
        try:
            if not os.path.exists(tgtFolder_baseFile_gitIgnore):
                copyFlg = True
            elif os.path.exists(tgtFolder_baseFile_gitIgnore) and overwriteFlg_input:
                # 当 tgtFolder_baseFile_gitIgnore 文件存在时，则不进行替换，以免覆盖 .gitignore 信息
                copyFlg = False
                白板.添加一行('baseFile_gitIgnore', 黄字('overwrite[No]'))

            if copyFlg:
                shutil.copy(baseFile_gitIgnore, tgtDir_input)
        except Exception as e:
            白板.提示错误('failed to copy baseFile_gitIgnore:', e)
            eFlg = True

        if copyFlg:
            if os.path.exists(tgtFolder_baseFile_gitIgnore):
                白板.添加一行('baseFile_gitIgnore copy', 绿字('OK'))
            else:
                白板.添加一行('file check failed:', 红字(tgtFolder_baseFile_gitIgnore))
                fileCheckFlg = False

    if flgOfCopyEnable_gitVerInfoCfg_cs:
        tgtFolder_baseFile_gitVerInfoCfg = tgtDir_input + 路径分隔符 + os.path.basename(baseFile_gitVerInfoCfg)
        copyFlg = False
        try:
            if not os.path.exists(tgtFolder_baseFile_gitVerInfoCfg):
                copyFlg = True
            elif os.path.exists(tgtFolder_baseFile_gitVerInfoCfg) and overwriteFlg_input:
                # 当 tgtFolder_baseFile_gitVerInfoCfg 文件存在时，则不进行替换，以免覆盖 gitVerInfoCfg 信息
                copyFlg = False
                白板.添加一行('baseFile_gitVerInfoCfg', 黄字('overwrite[No]'))

            if copyFlg:
                shutil.copy(baseFile_gitVerInfoCfg, tgtDir_input)

        except Exception as e:
            白板.提示错误('failed to copy baseFile_gitVerInfoCfg:', e)
            eFlg = True

        if copyFlg:
            if os.path.isfile(tgtFolder_baseFile_gitVerInfoCfg):
                白板.添加一行('baseFile_gitVerInfoCfg copy', 绿字('OK'))
            else:
                白板.添加一行('file check failed:', 红字(baseFile_gitVerInfoCfg))
                fileCheckFlg = False

    白板.展示表格()
    if not eFlg and fileCheckFlg:
        return True
    else:
        return False


def scriptsCopy(tgtFolder_input_: str = '',
                overwriteFlg_input_: int = -1,
                白板: 调试模板 = 调试模板()):
    global tgtDir_input
    global overwriteFlg_input

    白板.执行位置(scriptsCopy)

    白板.准备表格()
    if tgtFolder_input_ != '':
        tgtDir_input = tgtFolder_input_
        白板.添加一调试行('tgtFolder_input_ is: ', tgtDir_input)
    else:
        白板.添加一调试行('tgtFolder_input_ is: ', 'None')

    if int(overwriteFlg_input_) in [0, 1]:
        overwriteFlg_input = int(overwriteFlg_input_)
        白板.添加一调试行('overwriteFlg_input is: ', overwriteFlg_input)
    else:
        白板.添加一调试行('overwriteFlg_input is: ', 红字(str(overwriteFlg_input_) + '(invalid)'))
    白板.展示表格()

    if os.path.isdir(tgtDir_input):
        if baseScriptsCopy(tgtFolder_=tgtDir_input,
                           overwriteFlg_input_=overwriteFlg_input,
                           白板=白板.副本.缩进()):
            return True

    return False


if __name__ == '__main__':
    白板 = 调试模板(True)
    白板.执行位置(os.path.basename(__file__))

    ARGS = argParseCatch(白板=白板.副本.缩进())

    scriptsCopy(tgtFolder_input_=tgtDir_input,
                overwriteFlg_input_=overwriteFlg_input,
                白板=白板.副本.缩进())
